package com.example.playderdemo;

import android.app.Activity;
import android.media.AudioManager;
import android.media.FaceDetector;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Environment;
import android.os.SystemClock;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.Toast;

/**
 *  思考： 点击home 键， surfaceVie 会 destory ,
 */

public class MainActivity extends Activity implements OnClickListener{
    private EditText edt1;
    private Button bt_play;
    private Button bt_pause;
    private Button bt_replay;
    private Button bt_stop;
    private MediaPlayer mediaPlayer;
    private SurfaceView sv;
    private int currentPositon;
    private SeekBar sb;
    private boolean isplaying;

    String TAG= MainActivity.class.getName();
  	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        edt1=(EditText) findViewById(R.id.edt1);
        bt_play=(Button) findViewById(R.id.bt_play);
        bt_pause=(Button) findViewById(R.id.bt_pause);
        bt_replay=(Button) findViewById(R.id.bt_replay);
        bt_stop=(Button) findViewById(R.id.bt_stop);
        sv=(SurfaceView) findViewById(R.id.sv);
        sb=(SeekBar) findViewById(R.id.sb);
        
        sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
			
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				int process=seekBar.getProgress();
			 if(mediaPlayer!=null && mediaPlayer.isPlaying()){
				mediaPlayer.seekTo(process);
			  }
			}
			
			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
			 
			}
			
			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				  
			}
		});
        
      /* 为了解决低版本模拟式添加的 */
     /* 下面设置Surface 不维护自己的 缓冲区,而是等待屏幕渲染引擎内容推动到客户端 */
      /* 2.2、2.3有问题模拟器，用1.6 */
        sv.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        // getHolder监听器
        // 当播放进入后台的时候，在重新进来，画面出现黑色，推出的时候SurfaceView.holder销毁了，重新设置一下sv的holder
        sv.getHolder().addCallback(new Callback() {
			// 退出时候
			@Override
			public void surfaceDestroyed(SurfaceHolder holder) {


				Log.e(TAG,"surfaceDestroyed  ");
			if(mediaPlayer!=null && mediaPlayer.isPlaying()){
				currentPositon=mediaPlayer.getCurrentPosition();
				  stop();
		    	}
			}
			// 如果在次进来的时候
			@Override
			public void surfaceCreated(SurfaceHolder holder) {

				Log.e(TAG,"surfaceCreated  ");



	          if(currentPositon>0){
	        	  play(currentPositon);
	          }
			}
			@Override
			public void surfaceChanged(SurfaceHolder holder, int format, int width,
					int height) {


				Log.e(TAG,"surfaceChanged  ");
			 
			}
		});
        
        
        bt_play.setOnClickListener(this);
        bt_pause.setOnClickListener(this);
        bt_replay.setOnClickListener(this);
        bt_stop.setOnClickListener(this);
        
 
    }

	@Override
	public void onClick(View v) {
	   switch (v.getId()) {
	case R.id.bt_play:
		 play(0);
		break;
	case R.id.bt_pause:
		pause();
		break;
	case R.id.bt_replay:
		replay();
		break;
	case R.id.bt_stop:
		stop();
		break;
    	}
	}

// 在服务中写
   private void play(final int currentPositon) {
 //  String path=edt1.getText().toString().trim();
  // final String savePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/1moviestest/hello.mp4";
	   final String savePath =  "/sdcard/video.mkv";

    	  try {

			 // setDataSource 设置本地路径， 网络路径
			  mediaPlayer = new MediaPlayer();


			  //mediaPlayer=MediaPlayer.create(MainActivity.this, R.raw.video);
			  //创建mediaplayer对象

			  // 音频流的类型 STREAM_Ring:铃声  STREAM_alarm:更短
			  mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
			  
			// 把视频显示在 SurfaceView  的容器中
			  mediaPlayer.setDisplay(sv.getHolder());
			  
			 // 这里路径：可以使网络路径,http://xxx:8080/aa.3gp
			  mediaPlayer.setDataSource(savePath);



			  // 这里是同步的 prepare()没有准备完毕，start()不能执行  
		//	  mediaPlayer.prepare(); 
		//  mediaPlayer.start();	  
			//   这样做就不会造成主线程的柱塞，如果数据比较大，在子线程中准备
			  mediaPlayer.prepareAsync();//异步的，在另一个线程中跑
			  mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
				
				@Override
				public void onPrepared(MediaPlayer mp) {
				  mediaPlayer.start();
				  
				  // 设置最大的总长度
				  int max=mediaPlayer.getDuration();
				  sb.setMax(max);
				  
				  mediaPlayer.seekTo(currentPositon);
				  
				  // 在子线程中跟新进度
				  new Thread(){
				    public void run() {
				    	isplaying=true;
				        while(isplaying){
				          int positon=mediaPlayer.getCurrentPosition();
				          sb.setProgress(positon);
				          SystemClock.sleep(500);
				        }
				    }
				  }.start();
				}
			});
			
			  // 播放完以后的监听器
			  mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
				 
				@Override
				public void onCompletion(MediaPlayer mp) {
				   bt_play.setEnabled(true);
				}
			});
			  // 如果音频有问题,播着挂了
			 mediaPlayer.setOnErrorListener(new OnErrorListener() {
				@Override
				public boolean onError(MediaPlayer mp, int what, int extra) {
				    bt_play.setEnabled(true);
				    isplaying=false;
					return false;
				}
			});
			  
			  // 播放的时候不可以点击
			  bt_play.setEnabled(false);
			  
		} catch (Exception e) {
	   Toast.makeText(this, "视频播放失败", Toast.LENGTH_LONG).show();
			e.printStackTrace();
		} 
	}
   
	// 暂停
	private void pause() {
		// 如果是继续，那么播放即可
		if(bt_pause.getText().toString().trim().equals("继续")){
	      mediaPlayer.start();
		  bt_pause.setText("暂停");  
		 Toast.makeText(this, "继续", Toast.LENGTH_LONG).show();
		  return;
		}
		
		 if(mediaPlayer!=null && mediaPlayer.isPlaying()){
			    mediaPlayer.pause();
			    bt_pause.setText("继续");
			    isplaying=false;
			    return;
			  }  	
	}
// 如果是一个网络资源播放
/* 重播: stop() -> release() -play()
 */
	private void replay() {
		 if(mediaPlayer!=null && mediaPlayer.isPlaying()){
			mediaPlayer.seekTo(0);
			return ;
		  }  
		 play(0);
	}

	private void stop() {
	  if(mediaPlayer!=null && mediaPlayer.isPlaying()){
		  mediaPlayer.stop();
		  mediaPlayer.release();
		  mediaPlayer=null;
	  }
	}
}
